package com.music.note_android.data.repository

import com.music.note_android.data.model.Folder
import kotlinx.coroutines.flow.Flow

/**
 * 文件夹数据仓库接口
 * 定义文件夹相关的业务操作
 */
interface FolderRepository {
    
    /**
     * 获取所有文件夹（包括系统文件夹）
     */
    suspend fun getAllFolders(): List<Folder>
    
    /**
     * 获取所有文件夹的Flow（包括系统文件夹）
     */
    fun getAllFoldersFlow(): Flow<List<Folder>>
    
    /**
     * 获取文件夹及其笔记数量（包括系统文件夹）
     */
    suspend fun getFoldersWithNoteCount(): List<Folder>
    
    /**
     * 获取文件夹及其笔记数量的Flow（包括系统文件夹）
     */
    fun getFoldersWithNoteCountFlow(): Flow<List<Folder>>
    
    /**
     * 根据ID获取文件夹
     */
    suspend fun getFolderById(folderId: String): Folder?
    
    /**
     * 创建新文件夹
     */
    suspend fun createFolder(name: String): Result<Folder>
    
    /**
     * 更新文件夹
     */
    suspend fun updateFolder(folder: Folder): Result<Unit>
    
    /**
     * 重命名文件夹
     */
    suspend fun renameFolder(folderId: String, newName: String): Result<Unit>
    
    /**
     * 删除文件夹
     */
    suspend fun deleteFolder(folderId: String): Result<Unit>
    
    /**
     * 将笔记移动到指定文件夹
     */
    suspend fun moveNoteToFolder(noteId: String, folderId: String?): Result<Unit>
    
    /**
     * 批量将笔记移动到指定文件夹
     */
    suspend fun moveNotesToFolder(noteIds: List<String>, folderId: String?): Result<Unit>
    
    /**
     * 验证文件夹名称是否有效
     */
    suspend fun validateFolderName(name: String, excludeId: String? = null): ValidationResult
    
    /**
     * 检查文件夹是否可以删除
     */
    suspend fun canDeleteFolder(folderId: String): Boolean
}

/**
 * 文件夹名称验证结果
 */
sealed class ValidationResult {
    object Valid : ValidationResult()
    data class Invalid(val message: String) : ValidationResult()
}